home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / flin-0.5 / flin-0 / flin-0.5.1 / exec.c < prev    next >
C/C++ Source or Header  |  1996-03-14  |  3KB  |  156 lines

  1. #ifdef HAVE_CONFIG_H
  2. #include <config.h>
  3. #endif
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <sys/wait.h>
  9. #include <sys/types.h>
  10. #include <string.h>
  11. #include <syslog.h>
  12. #include <signal.h>
  13. #include <string.h>
  14.  
  15. #include "exec.h"
  16. #include "misc.h"
  17. #include "screen.h"
  18. #include "menu.h"
  19. #include "additional.h"
  20.  
  21. extern int exec_logging;
  22.  
  23. /* Finds the named menu */
  24. static int find_menu(struct menu **menu, char *name)
  25. {
  26.    struct menu *q = *menu;
  27.  
  28.    while (q->prev)
  29.       q = q->prev;
  30.  
  31.    while (q && (strcmp(q->name, name))) {
  32.       q = q->next;
  33.    }
  34.  
  35.    if (q) {
  36.       *menu = q;
  37.       return 0;
  38.    } else
  39.       return -1;
  40. }
  41.  
  42. void display_file(const char *filen)
  43. {
  44.    pid_t pid_child;
  45.    int child_stat;
  46.  
  47.    clear_scr();
  48.    close_scr();
  49.  
  50.    if ((pid_child = fork()) == -1)
  51.       error("No more pids\n", 0);
  52.    else if (pid_child > 0) {
  53.       waitpid(pid_child, &child_stat, WUNTRACED);
  54.    } else {
  55.       char *cmd_line = malloc(strlen(PAGER) + strlen(filen) + 2);
  56.  
  57.       sprintf(cmd_line, "%s %s", PAGER, filen);
  58.       system(cmd_line);
  59.       exit(0);
  60.    }
  61.  
  62.    printf("[----Hit the ENTER key when you're ready----]\n");
  63.    fflush(stdout);
  64.    while (getchar() != '\n');
  65.    fflush(stdin);
  66.    init_scr();
  67.    clear_scr();
  68. }
  69.  
  70. /* Interface to screen module
  71.    Execute menu item
  72.    item == item to execute
  73.    *menu == menu list ptr, for use with MENU_SUBs */
  74. void exec_item(struct menu_items item, struct menu **menu)
  75. {
  76.    pid_t pid_child;
  77.    int child_stat;
  78.    char args[255];
  79.    char exec[255];
  80.    char *argv[128];
  81.    int argc;
  82.  
  83.    switch (item.type) {
  84.    case MENU_SUB:
  85.       if (!find_menu(menu, item.args)) {
  86.      display_list(*menu);
  87.       } else
  88.      fprintf(stderr, "No menu named %s\n", item.name);
  89.       break;
  90.  
  91.    case MENU_ARGS:
  92.       if (get_args(args, item.prompt) == 0) {
  93.      sprintf(exec, "%s %s", item.args, args);
  94.  
  95.      clear_scr(); close_scr();
  96.      if (prep_for_exec(exec, &argc, argv, 127) > 0)
  97.         do_exec(exec, argc, argv);
  98.       
  99.      printf("[----Hit ENTER when you're ready----]\n");
  100.      fflush(stdout);
  101.      while (getchar() != '\n');
  102.      fflush(stdin);
  103.       }
  104.  
  105.       init_scr(); clear_scr();
  106.  
  107.       break;
  108.  
  109.    case MENU_EXEC:
  110.       clear_scr();
  111.       close_scr();
  112.  
  113.       if (prep_for_exec(item.args, &argc, argv, 127) > 0)
  114.      do_exec(item.args, argc, argv);
  115.       
  116.       printf("[----Hit ENTER when you're ready----]\n");
  117.       fflush(stdout);
  118.       while (getchar() != '\n');
  119.       fflush(stdin);
  120.       init_scr();
  121.       clear_scr();
  122.       break;
  123.    }
  124. }
  125.  
  126. int prep_for_exec(char *exec_line, int *argc, char **argv, int maxargc) {
  127.    int ret;
  128.  
  129.    ret = parseline(exec_line, argc, argv, maxargc);
  130.  
  131.    if (ret >= 0)
  132.       *(argv + *argc) = NULL;
  133.  
  134.    return ret;
  135. }
  136.  
  137. void do_exec(char *exec_line, int argc, char **argv) {
  138.    pid_t pid_child;
  139.    int child_stat;
  140.  
  141.    if ((pid_child = fork()) == -1)
  142.       error("No more pids\n", 0);
  143.    else if (pid_child > 0) {
  144.       if ((exec_logging == 1) && (exec_line != (char *) NULL))
  145.      syslog(LOG_LOCAL1 | LOG_INFO, "%d: %s (%d)", getpid(), exec_line, pid_child);
  146.  
  147.       waitpid(pid_child, &child_stat, WUNTRACED);
  148.  
  149.       for (; argc; --argc)
  150.      free((void *) *(argv + argc));
  151.    } else {
  152.       execvp(*argv, argv);
  153.       exit(0);
  154.    }
  155. }
  156.